﻿// NO LONGER NEEDED IN SL4 

//using System;
//using System.Collections.ObjectModel;
//using System.Collections.Specialized;
//using System.Linq;
//using System.Windows;
//using System.Windows.Interactivity;
//using nRoute.Utilities;

//namespace nRoute.Components
//{
//    public class DependencyObjectCollection<T>
//        : ObservableCollection<T>, IAttachedObject
//        where
//            T : DependencyObject, IAttachedObject
//    {
//        private const string ITEM_ALREADY_EXISTS = "Item already exists in the collection";
//        private const string DEPENDENCYOBJECT_CAN_ATTACHEDONCE = "DependencyObject can only be attached once";
//        private const string DEPENDENCYOBJECT_MUSTBE_FRAMEWORK = "Attached DependencyObject must be FrameworkElement derivative";

//        private FrameworkElement _associatedObject;

//        public DependencyObjectCollection()
//        {
//        }

//#region IAttachedObject related

//        DependencyObject IAttachedObject.AssociatedObject
//        {
//            get { return _associatedObject; }
//        }

//        void IAttachedObject.Attach(DependencyObject dependencyObject)
//        {
//            Guard.ArgumentNotNull(dependencyObject, "dependencyObject");
//            Guard.ArgumentValue(_associatedObject != null, "dependencyObject", DEPENDENCYOBJECT_CAN_ATTACHEDONCE);
//            Guard.ArgumentIsType(dependencyObject, typeof(FrameworkElement), "dependencyObject");

//            _associatedObject = (FrameworkElement)dependencyObject;

//            ((INotifyCollectionChanged)this).CollectionChanged += DependencyParametersCollection_CollectionChanged;
//            this.OnAttached();
//        }

//        void IAttachedObject.Detach()
//        {
//            this.OnDetaching();
//            ((INotifyCollectionChanged)this).CollectionChanged -= DependencyParametersCollection_CollectionChanged;

//            _associatedObject = null;
//        }

//#endregion

//#region Overridable

//        protected virtual void ItemAdded(T item)
//        {
//            if (_associatedObject != null)
//            {
//                ((IAttachedObject)_associatedObject).Attach(_associatedObject);
//            }
//        }

//        protected virtual void ItemRemoved(T item)
//        {
//            if (_associatedObject != null)
//            {
//                ((IAttachedObject)_associatedObject).Detach();
//            }
//        }

//        protected virtual void OnAttached() 
//        {
//            foreach (IAttachedObject _item in this)
//            {
//                _item.Attach(_associatedObject);
//            }
//        }

//        protected virtual void OnDetaching() 
//        {
//            foreach (IAttachedObject _item in this)
//            {
//                _item.Detach();
//            }
//        }

//#endregion

//#region Handlers

//        private void DependencyParametersCollection_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
//        {
//            switch (e.Action)
//            {
//                case NotifyCollectionChangedAction.Add:
//                    foreach (T _item in e.NewItems)
//                    {
//                        //VerifyAdd(_item);
//                        ItemAdded(_item);
//                    }
//                    break;

//                case NotifyCollectionChangedAction.Remove:
//                    foreach (T _item in e.OldItems)
//                    {
//                        ItemRemoved(_item);
//                    }
//                    break;

//                case NotifyCollectionChangedAction.Replace:
//                    foreach (T _item in e.OldItems)
//                    {
//                        ItemRemoved(_item);
//                    }
//                    foreach (T _item in e.NewItems)
//                    {
//                        //VerifyAdd(_item);
//                        ItemAdded(_item);
//                        continue;
//                    }
//                    break;

//                case NotifyCollectionChangedAction.Reset:
//                    foreach (T _item in this)
//                    {
//                        ItemRemoved(_item);
//                    }
//                    var _items = this.ToArray();
//                    foreach (T _item in _items)
//                    {
//                        //VerifyAdd(_item);
//                        ItemAdded(_item);
//                    }
//                    break;

//                default:
//                    return;
//            }
//        }

//#endregion

//#region Helpers

//        //private void VerifyAdd(T item)
//        //{
//        //    if (base.Items.Contains(item))
//        //    {
//        //        throw new InvalidOperationException(ITEM_ALREADY_EXISTS);
//        //    }
//        //}

//#endregion

//    }
//}